/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package vista;

import controlador.ControladorDeJoc;
import controlador.GestorDeDibuix;
import java.awt.Graphics;
import java.awt.MediaTracker;
import java.awt.Point;
import java.awt.image.BufferedImage;
import java.net.URL;
import java.util.Observable;
import java.util.Observer;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import model.ModelJoc;
import sprites.Sprite;

/**
 *
 * @author PA
 * @version 2010
 */
public class ZonaDeJoc extends JPanel implements Observer {

    /**
     *
     */
    private static final long serialVersionUID = -3271023844287269386L;
    public static final int ANCHO = 800;
    public static final int ALTO = 600;
    public static final Point pantalla = new Point(ZonaDeJoc.ANCHO, ZonaDeJoc.ALTO);
    private BufferedImage buffer;
    private ControladorDeJoc controlador;

    public ZonaDeJoc() {
        buffer = new BufferedImage(ANCHO, ALTO, BufferedImage.TYPE_INT_RGB);
    }

    public void jugar() {
        inici();
        controlador.jugar();
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        ModelJoc.getInstancia().pintar();
        g.drawImage(buffer, 0, 0, this);
    }

    public void inici() {
        GestorDeDibuix.getInstancia().inicializar(new MediaTracker(this),
                buffer.getGraphics(), this);
        String ficherosImagenes[][] = {
            {"BOLAL", "ball3.png"},
            {"BOLAR", "ball3p.png"},
            {"FONS", "escenari5.jpg"},
            {"SPACENEMESIS", "ufo.png"},
            {"SPACESHIP", "spaceship.png"},
            {"PLASMA", "plasma_ball.png"},
            {"MISSILE", "missile.png"},};

        try {
            for (int n = 0; n < ficherosImagenes.length; n++) {
                GestorDeDibuix.getInstancia().afegirImatge(
                        ficherosImagenes[n][0],
                        loadImage(ficherosImagenes[n][1]));
            }
        } catch (InterruptedException e) {
        }
        setBounds(0, 0, ZonaDeJoc.ANCHO, ZonaDeJoc.ALTO);
        //setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));
        controlador = new ControladorDeJoc(this);

        // Afeguim la clase com obsevadora
        ModelJoc.getInstancia().addObserver(this);
        this.addMouseMotionListener(controlador);
        this.addMouseListener(controlador);
        setVisible(true);
    }

    public void finalizar() {
        // Deixa de mirar patró observer
        ModelJoc.getInstancia().deleteObserver(this);
        setVisible(false);
    }

    // Patró Observable s'executa quan un objecte obsevat canvia
    public void update(Observable o, Object arg) {
        repaint();
    }

    // Carrega imatges del disc
    public BufferedImage loadImage(String nombre) {
        URL url = null;
        try {

            url = getClass().getClassLoader().getResource(nombre);
            System.out.println(url);
            return ImageIO.read(url);

        } catch (Exception e) {
            System.out.println("No s'ha pogut carregar la imatge " + nombre
                    + " de " + url);
            System.out.println("L' ha sigut: " + e.getClass().getName() + " "
                    + e.getMessage());
            System.exit(0);
            return null;
        }
    }
    
    public static boolean collision(Sprite spr1, Sprite spr2) {

        if ((spr2.getXright() < spr1.getXleft())
                || (spr2.getXleft() > spr1.getXright())) {
            return false;
        } else if ((spr2.getYdown() < spr1.getYup())
                || (spr2.getYup() > spr1.getYdown())) {
            return false;
        }
        else {
            return true;
        }
    }
}
